package com.jinunn.system.entity;

import com.baomidou.mybatisplus.annotation.*;

import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDateTime;

import com.jinunn.system.common.enums.MenuTypeEnum;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;

/**
 * <p>
 * 菜单管理
 * </p>
 *
 * @author JIN
 * @since 2024-07-11
 */
@Getter
@Setter
@Accessors(chain = true)
@TableName("sys_menu")
public class Menu implements Serializable {

    @Serial
    private static final long serialVersionUID = 1L;

    /**
     * ID
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;

    /**
     * 父菜单ID
     */
    @TableField("parent_id")
    private Long parentId;

    /**
     * 父节点ID路径
     */
    @TableField("tree_path")
    private String treePath;

    /**
     * 菜单名称
     */
    @TableField("name")
    private String name;

    /**
     * 菜单类型（1-菜单 2-目录 3-外链 4-按钮）
     */
    @TableField("type")
    private MenuTypeEnum type;

    /**
     * 路由名称（Vue Router 中用于命名路由）
     */
    @TableField("route_name")
    private String routeName;

    /**
     * 路由路径（Vue Router 中定义的 URL 路径）
     */
    @TableField("route_path")
    private String routePath;

    /**
     * 组件路径（组件页面完整路径，相对于 src/views/，缺省后缀 .vue）
     */
    @TableField("component")
    private String component;

    /**
     * 【按钮】权限标识
     */
    @TableField("perm")
    private String perm;

    /**
     * 【目录】只有一个子路由是否始终显示（1-是 0-否）
     */
    @TableField("always_show")
    private Integer alwaysShow;

    /**
     * 【菜单】是否开启页面缓存（1-是 0-否）
     */
    @TableField("keep_alive")
    private Integer keepAlive;

    /**
     * 显示状态（1-显示 0-隐藏）
     */
    @TableField("visible")
    private Integer visible;

    /**
     * 排序
     */
    @TableField("sort")
    private Integer sort;

    /**
     * 菜单图标
     */
    @TableField("icon")
    private String icon;

    /**
     * 跳转路径
     */
    @TableField("redirect")
    private String redirect;

    /**
     * 创建时间
     */
    @TableField(value = "create_time", fill = FieldFill.INSERT)
    private LocalDateTime createTime;

    /**
     * 更新时间
     */
    @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;

    /**
     * 路由参数
     */
    @TableField(value = "params", updateStrategy = FieldStrategy.ALWAYS)
    private String params;
}
